package com.dataseek.iot.core.handler;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dataseek.iot.core.response.ResponseEntity;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * @author cc
 * @Title: IServiceHandler
 * @Description: IServiceHandler
 * @date 2021/9/711:54 上午
 * @since 1.0
 */
public interface IServiceHandler<T> {

    /**
     * 保存单个数据
     * @param entity
     * @return
     */
    Mono<ResponseEntity> saveOne(T entity);

    /**
     * 批量保存数据
     * @param lists
     * @return
     */
    Mono<ResponseEntity> saveBatch(List<T> lists);

    /**
     * 根据ID移除数据
     * @param id
     * @return
     */
    Mono<ResponseEntity> removeById(String id);

    /**
     * 根据ID集合移除数据
     * @param ids
     * @return
     */
    Mono<ResponseEntity> removeAll(List<String> ids);

    /**
     * 根据条件移除数据
     * @param wrapper
     * @return
     */
    Mono<ResponseEntity> remove(Wrapper wrapper);

    /**
     * 根据ID移除数据
     * @param id
     * @return
     */
    Mono<ResponseEntity> remove(String id);

    /**
     * 更新数据
     * @param entity
     * @return
     */
    Mono<ResponseEntity> updateOne(T entity);

    /**
     * 根据条件更新数据
     * @param wrapper
     * @return
     */
    Mono<ResponseEntity> update(Wrapper wrapper);

    /**
     * 批量更新
     * @param entities
     * @return
     */
    Mono<ResponseEntity> updateBatch(List<T> entities);

    /**
     * 根据ID查询数据
     * @param id
     * @return
     */
    Mono<ResponseEntity> findOne(String id);

    /**
     * 分页查询所有
     * @return
     */
    Mono<ResponseEntity> page(Page p);

    Mono<ResponseEntity> page(Page p, Wrapper wrapper);

    /**
     * 根据ID集合查看所有数据
     * @param ids
     * @return
     */
    Flux<ResponseEntity> find(List<String> ids);

    /**
     * 根据条件查询数据
     * @param wrapper
     * @return
     */
    Flux<ResponseEntity> find(Wrapper wrapper);

    /**
     * 不带分页的查询所有数据
     * @return
     */
    Flux<ResponseEntity> findAll();

    /**
     * default
     * @return
     */
    Mono<ResponseEntity> defaultResponseOne(ResponseEntity responseEntity);
    /**
     * default
     * @return
     */
    Flux<ResponseEntity> defaultResponseTwo(ResponseEntity responseEntity);


}
